package com.hyf.order.service.impl;

import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.github.wxpay.sdk.WXPayUtil;
import com.hyf.order.entity.Order;
import com.hyf.order.entity.PayLog;
import com.hyf.order.mapper.PayLogMapper;
import com.hyf.order.service.OrderService;
import com.hyf.order.service.PayLogService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.hyf.order.utils.HttpClient;
import com.hyf.service.config.exception.GuliException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.math.BigDecimal;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.TimeUnit;

/**
 * <p>
 * 支付日志表 服务实现类
 * </p>
 *
 * @author hyf
 * @since 2022-05-08
 */
@Service
public class PayLogServiceImpl extends ServiceImpl<PayLogMapper, PayLog> implements PayLogService {
	
	@Autowired
	private OrderService orderService;// 订单的service

	
	// 支付二维码的接口
	@Override
	public Map createNative(String orderNo) {
		try {
			//根据订单号获取订单信息
			QueryWrapper<Order> wrapper = new QueryWrapper<>();
			wrapper.eq("order_no",orderNo);
			Order order = orderService.getOne(wrapper);
			//设置支付参数，使用map设置生成二维码需要的参数
			Map m = new HashMap();
			m.put("appid", "wx74862e0dfcf69954");
			m.put("mch_id", "1558950191");
			m.put("nonce_str", WXPayUtil.generateNonceStr());
			m.put("body", order.getCourseTitle());// 课程标题
			m.put("out_trade_no", orderNo);//订单号
			m.put("total_fee", order.getTotalFee().multiply(new BigDecimal("100")).longValue()+"");// 订单的价格
			m.put("spbill_create_ip", "127.0.0.1");
			m.put("notify_url", "http://guli.shop/api/order/weixinPay/weixinNotify\n");
			m.put("trade_type", "NATIVE");// 支付类型
			//HTTPClient来根据URL访问第三方接口并且传递参数，微信支付固定的地址
			HttpClient client = new HttpClient("https://api.mch.weixin.qq.com/pay/unifiedorder");
			//client设置参数，设置xml参数
			client.setXmlParam(WXPayUtil.generateSignedXml(m, "T6m9iK73b0kn9g5v426MKfHQH7X8rKwb"));
			client.setHttps(true);
			// 执行发送请求
			client.post();


			//返回第三方的数据，xml格式，返回内容转换成map集合方便查询
			String xml = client.getContent();
			// 把xml格式转换成map集合，通过map返回
			Map<String, String> resultMap = WXPayUtil.xmlToMap(xml);

			System.out.println("resultMap:========"+resultMap);
			//封装最终返回结果集
			Map map = new HashMap<>();
			map.put("out_trade_no", orderNo);
			map.put("course_id", order.getCourseId());
			map.put("total_fee", order.getTotalFee());
			map.put("result_code", resultMap.get("result_code"));// 返回二维码的状态码
			map.put("code_url", resultMap.get("code_url"));// 二维码地址
			//微信支付二维码2小时过期，可采取2小时未支付取消订单
			//redisTemplate.opsForValue().set(orderNo, map, 120, TimeUnit.MINUTES);
			System.out.println("******************"+map);
			return map;
		} catch (Exception e) {
			throw new GuliException(20001,"生成二维码失败");
		}

	}


	
/*	//生成微信支付二维码接口
	@Override
	public Map createNative(String orderNo) {
		try{
			//1，根据订单号查询订单信息
			QueryWrapper<Order> wrapper = new QueryWrapper<>();
			wrapper.eq("order_no",orderNo);
			Order order = orderService.getOne(wrapper);
			
			//2，使用map设置生成二维码需要的参数
			Map m = new HashMap();
			m.put("appid", "wx74862e0dfcf69954");
			m.put("mch_id", "1558950191");
			m.put("nonce_str", WXPayUtil.generateNonceStr());
			m.put("body", order.getCourseTitle());
			m.put("out_trade_no", orderNo);
			m.put("total_fee", order.getTotalFee().multiply(new BigDecimal("100")).longValue()+"");
			m.put("spbill_create_ip", "127.0.0.1");
			m.put("notify_url", "http://guli.shop/api/order/weixinPay/weixinNotify");
			m.put("trade_type", "NATIVE");
			
			//3，发送httpclient请求，传递参数xml格式，微信支付提供的固定的地址
			HttpClient client = new HttpClient("https://api.mch.weixin.qq.com/pay/unifiedorder");
			//client设置参数
			client.setXmlParam(WXPayUtil.generateSignedXml(m, "T6m9iK73b0kn9g5v426MKfHQH7X8rKwb"));
			client.setHttps(true);
			
			//执行请求发送
			client.post();
			
			//4，得到发送请求返回结果，返回内容是使用xml格式返回
			String xml = client.getContent();
			
			//把xml格式转换成map集合，把map集合返回
			Map<String, String> resultMap = WXPayUtil.xmlToMap(xml);
			//最终返回数据的封装
			Map map = new HashMap();
			map.put("out_trade_no", orderNo);
			map.put("course_id", order.getCourseId());
			map.put("total_fee", order.getTotalFee());
			map.put("result_code", resultMap.get("result_code"));//返回二维码操作状态码
			map.put("code_url", resultMap.get("code_url"));//二维码地址
			// 设置的过期时间
//			if(resultMap.get("result_code") != null) {
//				redisTemplate.opsForValue().set(orderId.toString(),map,120, TimeUnit.MINUTES);
//			}
			return map;
			
		}catch (Exception e){
			throw new GuliException(20001,"生成二维码失败");
		}
	}
	*/
	
	
	
	
	
	// 根据订单号查询订单的支付状态，并修改支付状态
	@Override
	public void updateOrderStatus(Map<String, String> map) {
		//获取订单id
		String orderNo = map.get("out_trade_no");
		
		//根据订单id查询订单信息
		QueryWrapper<Order> wrapper = new QueryWrapper<>();
		wrapper.eq("order_no",orderNo);
		Order order = orderService.getOne(wrapper);
		
		
		
		if(order.getStatus().intValue() == 1) return;
		order.setStatus(1);//1代表已经支付
		orderService.updateById(order);
		
		//记录支付日志，向支付表添加支付记录
		PayLog payLog=new PayLog();
		payLog.setOrderNo(order.getOrderNo());//支付订单号
		payLog.setPayTime(new Date());//订单完成的时间
		payLog.setPayType(1);//支付类型，
		payLog.setTotalFee(order.getTotalFee());//总金额(分)
		payLog.setTradeState(map.get("trade_state"));//支付状态
		payLog.setTransactionId(map.get("transaction_id"));// 订单的流水号
		payLog.setAttr(JSONObject.toJSONString(map));
		
		baseMapper.insert(payLog);//插入到支付日志表
		
	}
	
	// 根据订单号查询订单的支付状态
	@Override
	public Map queryPayStatus(String orderNo) {
		try {
			//1、封装参数
			Map m = new HashMap<>();
			m.put("appid", "wx74862e0dfcf69954");
			m.put("mch_id", "1558950191");
			m.put("out_trade_no", orderNo);
			m.put("nonce_str", WXPayUtil.generateNonceStr());
			//2、设置请求，发送httpclient 请求
			HttpClient client = new HttpClient("https://api.mch.weixin.qq.com/pay/orderquery");
			client.setXmlParam(WXPayUtil.generateSignedXml(m, "T6m9iK73b0kn9g5v426MKfHQH7X8rKwb"));
			client.setHttps(true);
			client.post();
			//3、得到返回第三方的数据
			String xml = client.getContent();
			//6、转成Map
			Map<String, String> resultMap = WXPayUtil.xmlToMap(xml);
			//7、返回
			return resultMap;
		} catch (Exception e) {
			e.printStackTrace();
		}
		
		return null;
		
	}
}
